home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / SAYF.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-31  |  1.4 KB  |  64 lines

  1. unsigned char far *CurrentPos( void );
  2. unsigned char far *ScrPtr( int x, int y );
  3. void RestoreCurPos( unsigned char far *s );
  4. void ScrollUp( int x, int y, int xx, int yy, int n );
  5. void Beep( void );
  6. void TcclibInitialize( void );
  7.  
  8. #define VIDMODE   *(unsigned char far *) 0x00449lu
  9. #define MONOSEG  0xb0000000L
  10. #define COLOR 0xb8000000L
  11. #define VIDSEG (unsigned char far *)((7 == VIDMODE) ? MONOSEG : COLOR )
  12.  
  13. #define BELL 7
  14. #define TAB  9
  15.  
  16. #include <stdio.h>
  17.  
  18. extern unsigned char attrib;
  19.  
  20. void SayF( char *fmt, ... )
  21. {
  22.     register unsigned char far *scptr = CurrentPos();
  23.     unsigned char far *scend = ScrPtr( 80, 25 );
  24.     char s[240];
  25.     register char *cp = s;
  26.     va_list argptr;
  27.  
  28.     TcclibInitialize();
  29.  
  30.     va_start( argptr, format );
  31.     vsprintf( s, fmt, argptr );
  32.     va_end( argptr );
  33.  
  34.     while (*cp) {
  35.         switch( *cp ) {
  36.             case '\n':
  37.                 scptr = (unsigned char far *) ((long) scptr + (long) 160 );
  38.             case '\r':
  39.                 scptr = (unsigned char far *)
  40.                     ( ( ( (long) scptr - (long) VIDSEG ) /
  41.                           (long) 160 ) * (long) 160 + (long) VIDSEG );
  42.                 cp++;
  43.                 break;
  44.             case BELL:
  45.                 Beep();
  46.                 cp++;
  47.                 break;
  48.             case TAB:
  49.                 scptr = (unsigned char far *) ( (long) scptr / 16 * 16 );
  50.                 cp++;
  51.                 break;
  52.             default:
  53.                 *scptr++ = *cp++;
  54.                 *scptr++ = attrib;
  55.                 break;
  56.         }
  57.         if ( scptr > scend ) {
  58.             ScrollUp( 1, 1, 80, 25, 1 );
  59.             scptr -= 160;
  60.         }
  61.     }
  62.     RestoreCurPos( scptr );
  63. }
  64.